home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / alv.sun / alv.lha / src / winlev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-08  |  3.5 KB  |  173 lines

  1. #include <stdio.h>
  2. #include "defs.h"
  3.  
  4. har   *progname;
  5. har   *filename;
  6. ixrect *pr1, *pr2;
  7. nt     old_level, old_window;
  8. nt     max_level, min_level;
  9. nt     lower, upper;
  10. nt     table[10000];
  11. nt     window, level;
  12.  
  13. #ifdef STANDALONE
  14. ain(argc, argv, envp)
  15. #else
  16. inlev_main(argc, argv, envp)
  17. #endif
  18.     int     argc;
  19.     char  **argv;
  20.     char  **envp;
  21. {
  22.     register int i, j;
  23.     int     levels;
  24.     float   winlev_calc_mean();
  25.     colormap_t colormap;
  26.  
  27.     window = level = -1;
  28.     progname = strsave(argv[0]);
  29.     parse_profile(&argc, argv, envp);
  30.  
  31.     while ((gc = getopt(argc, argv, "w:l:")) != EOF)
  32.         switch (gc) {
  33.         case 'w':
  34.             window = atoi(optarg);
  35.             break;
  36.         case 'l':
  37.             level = atoi(optarg);
  38.             break;
  39.         case '?':
  40.             errflag++;
  41.             break;
  42.         }
  43.  
  44.     if (errflag)
  45.         error((char *) 0, "Usage: %s: [-w window] [-l level] [infile] [outfile]\n", progname);
  46.  
  47.     for (stream = 0; optind < argc; stream++, optind++)
  48.         if (stream < 2 && strcmp(argv[optind], "-") != 0)
  49.             if (freopen(argv[optind], mode[stream], f[stream]) == NULL)
  50.                 error("%s %s", PR_IO_ERR_INFILE, argv[optind]);
  51.  
  52.     if ((pr1 = pr_load(stdin, &colormap)) == NULL)
  53.         error(PR_IO_ERR_RASREAD);
  54.  
  55.     if (bitrestrict)
  56.         levels = calc_max(pr1)+1;
  57.     else
  58.         levels = MAXLEVEL(pr1->pr_depth);
  59.  
  60.     if (window == -1)
  61.         window = MAXLEVEL(8) * 2;
  62.     if (level == -1)
  63.         level = (int) winlev_calc_mean(pr1);
  64.  
  65.     if (level > levels || level < 0)
  66.         error("level setting outside range of levels in image");
  67.  
  68.     if (window > levels || window < 0)
  69.         error("window setting outside range of levels in image");
  70.  
  71.     if ((pr2 = mem_create(pr1->pr_size.x, pr1->pr_size.y, 8)) == NULL)
  72.         error("mem_create returned NULL");
  73.  
  74.     min_level = 0;
  75.     max_level = levels;
  76.     old_window = levels;
  77.     old_level = levels / 2;
  78.     setuptable();
  79.     winlev_convert_to_8bits(pr1, pr2);
  80.  
  81.     pr_dump(pr2, stdout, &colormap, RT_STANDARD, 0);
  82. }
  83. /* initialise lookup table for current window & level */
  84. etuptable()
  85. {
  86.     register int i;
  87.     register int *t;
  88.     register int new_lower, new_upper;
  89.     int     old_lower, old_upper;
  90.     double  m, cumulative_greylevel;
  91.  
  92.     if (window != 0)
  93.         m = 253. / (float) window;  /* 253 = No. greylevels * - 1 */
  94.  
  95.     cumulative_greylevel = 1.;
  96.     new_lower = level - window / 2;
  97.     new_upper = level + window / 2;
  98.     old_lower = old_level - old_window / 2;
  99.     old_upper = old_level + old_window / 2;
  100.  
  101.     lower = MIN(old_lower, new_lower);
  102.     upper = MAX(old_upper, new_upper);
  103.  
  104.     lower = 0;
  105.     upper = max_level;
  106.     t = &table[lower];
  107.     for (i = lower; i < upper; i++)
  108.         if (i <= new_lower)
  109.             *t++ = 1;
  110.         else if (i >= new_upper)
  111.             *t++ = 254;
  112.         else {
  113.             *t++ = cumulative_greylevel;
  114.             cumulative_greylevel += m;
  115.         }
  116.     old_level = level;
  117.     old_window = window;
  118. }
  119.  
  120. inlev_convert_to_8bits(in, out)
  121.     Pixrect *in, *out;
  122. {
  123.     short  *ptr16;
  124.     int    *ptr32;
  125.     char   *ptr8;
  126.     register int i;
  127.     int     n;
  128.     int     mode = TRUE;
  129.  
  130. #define ALL_PIXELS      TRUE
  131.  
  132.     ptr8 = (char *) mpr_d(out)->md_image;
  133.     n = in->pr_size.x * in->pr_size.x;
  134.  
  135.     switch (in->pr_depth) {
  136.     case 16:
  137.         ptr16 = (short *) mpr_d(in)->md_image;
  138.         for (i = 0; i < n; i++) {
  139.             if ((mode == ALL_PIXELS) || ((*ptr16 >= lower) && (*ptr16 <= upper)))
  140.                 *ptr8 = *(table + (*ptr16));
  141.             ptr8++;
  142.             ptr16++;
  143.         }
  144.         break;
  145.     case 32:
  146.         ptr32 = (int *) mpr_d(in)->md_image;
  147.  
  148.         for (i = 0; i < n; i++) {
  149.             if ((mode == ALL_PIXELS) || ((*ptr32 >= lower) && (*ptr32 <= upper)))
  150.                 *ptr8 = *(table + (*ptr32));
  151.             ptr8++;
  152.             ptr16++;
  153.         }
  154.         break;
  155.     }
  156. }
  157.  
  158.  
  159. loat
  160. inlev_calc_mean(pr)
  161.     Pixrect *pr;
  162. {
  163.     register int i, j;
  164.     int     sum;
  165.  
  166.     sum = 0;
  167.     for (j = 0; j < pr->pr_size.y; j++)
  168.         for (i = 0; i < pr->pr_size.x; i++)
  169.             sum += pr_get(pr, i, j);
  170.  
  171.     return (sum / (pr->pr_size.x * pr->pr_size.y));
  172. }
  173.